package com.dylan.历史.多线程.并发编程的艺术.编程基础;

import com.dylan.历史.util.SleepUtils;
import org.junit.Test;

/**
 * Created by Dylan on 2018/7/12.
 */
public class 线程中断 {

    /**
     * 展示中断对线程中断的影响
     * 1. 执行interrupt()会设置中断标识位
     * 2. 响应中断操作的方法，如sleep，join（wait()实现的），wait等会抛出中断异常且清除标志位
     * 3. 正在运行计算的线程不会响应该中断，需要调用interrupted()自己判断是否被中断
     */
    @Test
    public void test1() {
        // 不停的尝试睡眠
        Thread sleepThread = new Thread(new SleepRunner(), "sleepThread");
        // 不停的运行
        Thread busyThread = new Thread(new BusyRunner(), "busyThread");
        sleepThread.setDaemon(true);
        sleepThread.start();
        busyThread.setDaemon(true);
        busyThread.start();
        SleepUtils.seconds(1);

        // 调用interrupt()会设置中断标识位为true。sleep()方法会响应该中断且抛出中断异常，并清除标识位（即设置为false）
        sleepThread.interrupt();
        // 调用interrupt()会设置中断标识位为true。由于在计算过程中没有响应中断
        busyThread.interrupt();

        System.out.println(sleepThread.isInterrupted()); // false，标志位已被清楚
        System.out.println(busyThread.isInterrupted()); // true

        SleepUtils.seconds(1);
        // 异常被拦截，线程继续运行
        System.out.println(sleepThread.getState());
        // 没有处理这个中断标识位，线程继续运行
        System.out.println(busyThread.getState());
    }

    class SleepRunner implements Runnable {

        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
//                    e.printStackTrace();
                }
            }
        }
    }

    class BusyRunner implements Runnable {

        @Override
        public void run() {
            while (true) {
                int i = (int) (Math.random() * 1000000);
//                System.out.println(i);
            }
        }
    }
}
